/**
* File Name: mmap_w.c
* Auther: Jichang
* Create Time: 2023年10月06日 星期五 16时15分50秒
* mmap写，非血缘关系
*/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/mman.h>
#include<errno.h>
#include<fcntl.h>
#include<string.h>

/* 结构体写到缓冲区 */
struct student {
	int id;
	char name[256];
	int age;
};

void sys_err(const char *str) {
	perror(str);
	exit(1);
}

int main(int argc, char *argv[]) {
	struct student stu = {1, "xiaoming", 18};
	struct student *p;
	int fd;
	//fd = open("test_map", O_RDWR|O_CREAT|O_TRUNC, 0644);
	fd = open("test_map", O_RDWR, 0644);
	if(fd == -1) {
		sys_err("open error");
	}
	//创建一个结构体大小的共享内存映射区
	ftruncate(fd, sizeof(stu));
	
	p = mmap(NULL, sizeof(stu), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
	if(p == MAP_FAILED) {
		sys_err("mmap error");
	}
	close(fd);

	while(1) {
		memcpy(p, &stu, sizeof(stu)); //内存操作
		stu.id++;
		sleep(2);
	}

	munmap(p, sizeof(stu));

	return 0;
}

